home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / util / primitives / mapping.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  16KB  |  498 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from funcs import isiterable
  5. from functional import AttrChain
  6. from itertools import tee
  7.  
  8. def fmt_to_dict(delim1, delim2):
  9.     
  10.     class dictifier('dictifier', (dict,)):
  11.         
  12.         def __init__(self, *a, **k):
  13.             if a and isinstance(a[0], basestring):
  14.                 dict.__init__(self, self.parse(a[0]), *a[1:], **k)
  15.             else:
  16.                 dict.__init__(self, *a, **k)
  17.  
  18.         
  19.         def parse(cls, s):
  20.             return (tuple,)((lambda .0: for entry in .0:
  21. entry.strip().split(delim2, 1))(s.split(delim1)))
  22.  
  23.         parse = (None, classmethod)(parse)
  24.         
  25.         def __str__(self):
  26.             return (delim1.join,)((lambda .0: for i in .0:
  27. delim2.join(i))(self.items()))
  28.  
  29.  
  30.     return dictifier
  31.  
  32.  
  33. def dictreverse(mapping):
  34.     return dict((lambda .0: for key, value in .0:
  35. (value, key))(mapping.iteritems()))
  36.  
  37.  
  38. def dictadd(dict_a, dict_b):
  39.     result = dict(dict_a)
  40.     result.update(dict_b)
  41.     return result
  42.  
  43.  
  44. def dictsub(a, b):
  45.     a = a.copy()
  46.     for key in b:
  47.         a.pop(key, None)
  48.     
  49.     return a
  50.  
  51.  
  52. def dictdiff(defaults, user):
  53.     diff = { }
  54.     for k, v in user.iteritems():
  55.         if k not in defaults or v != defaults[k]:
  56.             diff[k] = v
  57.             continue
  58.     
  59.     return diff
  60.  
  61.  
  62. def intdictdiff(start, end):
  63.     keys = set(start.keys()) | set(end.keys())
  64.     out = { }
  65.     for key in keys:
  66.         startval = start.get(key, 0)
  67.         endval = end.get(key, 0)
  68.         outval = endval - startval
  69.         if outval:
  70.             out[key] = outval
  71.             continue
  72.     
  73.     return out
  74.  
  75.  
  76. class DictChain(AttrChain, dict):
  77.     
  78.     def __init__(self, *args, **kwargs):
  79.         dict.__init__(self, *args, **kwargs)
  80.         AttrChain.__init__(self, 'base', self.__getattr2__)
  81.  
  82.     
  83.     def __getattr2__(self, key):
  84.         keys = None if isinstance(key, basestring) else key
  85.         next = self[keys[0]]
  86.         if len(keys) > 1 and isinstance(next, DictChain):
  87.             return dict.__getattribute__(next, '__getattr2__')(keys[1:])
  88.         elif keys:
  89.             
  90.             try:
  91.                 returner = next
  92.             except:
  93.                 return self['generic'][keys[0]]
  94.  
  95.             if isinstance(returner, DictChain):
  96.                 return returner['value']
  97.             else:
  98.                 return returner
  99.         else:
  100.             return self['value']
  101.  
  102.  
  103.  
  104. class Storage(dict):
  105.     
  106.     def __getattr__(self, key, ga = dict.__getattribute__, gi = dict.__getitem__):
  107.         
  108.         try:
  109.             return ga(self, key)
  110.         except AttributeError:
  111.             
  112.             try:
  113.                 return gi(self, key)
  114.             except KeyError:
  115.                 msg = repr(key)
  116.                 if len(self) <= 20:
  117.                     keys = sorted(self.keys())
  118.                     msg += '\n  (%d existing keys: ' % len(keys) + str(keys) + ')'
  119.                 
  120.                 raise AttributeError, msg
  121.             except:
  122.                 None<EXCEPTION MATCH>KeyError
  123.             
  124.  
  125.             None<EXCEPTION MATCH>KeyError
  126.  
  127.  
  128.     
  129.     def __setattr__(self, key, value):
  130.         self[key] = value
  131.  
  132.     
  133.     def copy(self):
  134.         return type(self)(self)
  135.  
  136.  
  137. Storage.__module__ = 'util.primitives'
  138.  
  139. def dictrecurse(newtype):
  140.     
  141.     def recurser(_d, forbidden = (None, ())):
  142.         if not hasattr(_d, 'keys'):
  143.             pformat = pformat
  144.             import pprint
  145.             raise TypeError('what is?\n%s' % pformat(_d))
  146.         
  147.         for k in _d:
  148.             if isinstance(_d[k], dict):
  149.                 _d[k] = recurser(_d[k])
  150.                 continue
  151.             if isiterable(_d[k]) and not isinstance(_d[k], forbidden + (basestring,)):
  152.                 _d[k] = (list,)((lambda .0: for item in .0:
  153. None if isinstance(item, dict) else item)(_d[k]))
  154.                 continue
  155.         
  156.         if isinstance(newtype, type):
  157.             return None if isinstance(_d, newtype) else newtype(_d)
  158.         else:
  159.             return newtype(_d)
  160.  
  161.     return recurser
  162.  
  163. to_storage = dictrecurse(Storage)
  164.  
  165. def from_storage(d):
  166.     for k, v in d.items():
  167.         None if isinstance(v, Storage) else []
  168.     
  169.     return None if type(d) is dict else dict(d)
  170.  
  171.  
  172. def lookup_table(*a, **d):
  173.     d = dict(*a, **d)
  174.     d.update(dictreverse(d))
  175.     return to_storage(d)
  176.  
  177.  
  178. class no_case_dict(dict):
  179.     
  180.     def __getitem__(self, attr, get = dict.__getitem__):
  181.         return get(self, attr.lower())
  182.  
  183.     
  184.     def __setitem__(self, attr, val):
  185.         return dict.__setitem__(self, attr.lower(), val)
  186.  
  187.     
  188.     def __delitem__(self, key):
  189.         return dict.__delitem__(self, key.lower())
  190.  
  191.     
  192.     def __contains__(self, attr):
  193.         return dict.__contains__(self, attr.lower())
  194.  
  195.     
  196.     def setdefault(self, attr, default):
  197.         
  198.         try:
  199.             return dict.__getitem__(self, attr.lower())
  200.         except KeyError:
  201.             dict.__setitem__(self, attr.lower(), default)
  202.             return default
  203.  
  204.  
  205.     
  206.     def pop(self, k, x = None):
  207.         return dict.pop(self, k.lower(), x)
  208.  
  209.  
  210.  
  211. def stringify_dict(dict):
  212.     new = { }
  213.     for k, v in dict.items():
  214.         if isinstance(k, basestring):
  215.             new[str(k)] = v
  216.             continue
  217.         new[k] = v
  218.     
  219.     return new
  220.  
  221.  
  222. class odict(dict):
  223.     
  224.     def __init__(self, d = None):
  225.         if d is None:
  226.             d = { }
  227.         
  228.         
  229.         try:
  230.             t = d.items()
  231.             self._keys = [ k for k, _v in t ]
  232.             dict.__init__(self, t)
  233.         except:
  234.             (one, two, three) = tee(d, 3)
  235.             
  236.             try:
  237.                 self._keys = [ k for k, _v in one ]
  238.             except:
  239.                 self._keys = [ k for k in two ]
  240.  
  241.             [](dict.__init__, self if isinstance(d, dict) else three)
  242.  
  243.  
  244.     
  245.     def __delitem__(self, key):
  246.         dict.__delitem__(self, key)
  247.         self._keys.remove(key)
  248.  
  249.     
  250.     def __setitem__(self, key, item):
  251.         dict.__setitem__(self, key, item)
  252.         if not hasattr(self, '_keys'):
  253.             self._keys = [
  254.                 key]
  255.         
  256.         if key not in self._keys:
  257.             self._keys.append(key)
  258.         
  259.  
  260.     __iter__ = property((lambda self: self._keys.__iter__))
  261.     
  262.     def clear(self):
  263.         dict.clear(self)
  264.         self._keys = []
  265.  
  266.     
  267.     def pop(self, k, defval = sentinel):
  268.         
  269.         try:
  270.             val = dict.pop(self, k)
  271.         except KeyError:
  272.             if defval is sentinel:
  273.                 raise 
  274.             else:
  275.                 return defval
  276.         except:
  277.             defval is sentinel
  278.  
  279.         self._keys.remove(k)
  280.         return val
  281.  
  282.     
  283.     def iteritems(self):
  284.         for i in self._keys:
  285.             
  286.             try:
  287.                 yield (i, self[i])
  288.             continue
  289.             except KeyError:
  290.                 print 'fake keys', self._keys
  291.                 print 'real keys', self.keys()
  292.                 raise 
  293.                 continue
  294.             
  295.  
  296.         
  297.  
  298.     
  299.     def items(self):
  300.         return list(self.iteritems())
  301.  
  302.     
  303.     def keys(self):
  304.         return self._keys
  305.  
  306.     
  307.     def popitem(self):
  308.         if len(self._keys) == 0:
  309.             raise KeyError('dictionary is empty')
  310.         else:
  311.             key = self._keys[-1]
  312.             val = self[key]
  313.             del self[key]
  314.             return (key, val)
  315.  
  316.     
  317.     def setdefault(self, key, failobj = None):
  318.         ret = dict.setdefault(self, key, failobj)
  319.         if key not in self._keys:
  320.             self._keys.append(key)
  321.         
  322.         return ret
  323.  
  324.     
  325.     def update(self, d):
  326.         
  327.         try:
  328.             for key in d.keys():
  329.                 if not self.has_key(key):
  330.                     self._keys.append(key)
  331.                     continue
  332.         except AttributeError:
  333.             for k, v in d:
  334.                 self[k] = v
  335.             
  336.             return None
  337.  
  338.         dict.update(self, d)
  339.  
  340.     
  341.     def values(self):
  342.         for i in self._keys:
  343.             yield self[i]
  344.         
  345.  
  346.     
  347.     def move(self, key, index):
  348.         
  349.         try:
  350.             cur = self._keys.index(key)
  351.         except ValueError:
  352.             raise KeyError(key)
  353.  
  354.         self._keys.insert(index, key)
  355.         if cur >= index:
  356.             cur = cur + 1
  357.         
  358.         del self._keys[cur]
  359.  
  360.     
  361.     def index(self, key):
  362.         if not self.has_key(key):
  363.             raise KeyError(key)
  364.         
  365.         return self._keys.index(key)
  366.  
  367.  
  368.  
  369. class LazySortedDict(odict):
  370.     
  371.     def _get_keys(self):
  372.         
  373.         try:
  374.             self._real_keys = sorted(self._real_keys)
  375.         except AttributeError:
  376.             self._real_keys = []
  377.  
  378.         return self._real_keys
  379.  
  380.     
  381.     def _set_keys(self, keys):
  382.         self._real_keys = sorted(keys)
  383.  
  384.     
  385.     def copy(self):
  386.         return type(self)(self)
  387.  
  388.     _keys = property(_get_keys, _set_keys)
  389.  
  390.  
  391. class ostorage(odict, Storage):
  392.     
  393.     def __getattr__(self, attr):
  394.         if attr == '_keys':
  395.             return odict.__getattr__(self, '_keys')
  396.         else:
  397.             return Storage.__getattr__(self, attr)
  398.  
  399.     
  400.     def __setattr__(self, attr, val):
  401.         if attr == '_keys':
  402.             return odict.__setattr__(self, attr, val)
  403.         else:
  404.             return Storage.__setattr__(self, attr, val)
  405.  
  406.  
  407.  
  408. def groupify(seq, keys = None, whitelist = True, mapclass = odict):
  409.     retval = [
  410.         mapclass()]
  411.     idx = 0
  412.     for k, v in seq:
  413.         if keys and whitelist ^ (k in keys):
  414.             continue
  415.         
  416.         if k in retval[idx]:
  417.             retval.append(mapclass())
  418.             idx += 1
  419.         
  420.         retval[idx][k] = v
  421.     
  422.     if not retval[0]:
  423.         return []
  424.     
  425.     return retval
  426.  
  427.  
  428. class FilterDict(dict):
  429.     
  430.     def __init__(self, filterfunc, d = None, **kw):
  431.         if d is None:
  432.             d = { }
  433.         
  434.         dict.__init__(self)
  435.         d.update(kw)
  436.         dict.__setattr__(self, 'ff', filterfunc)
  437.         for k, v in d.iteritems():
  438.             self.__setitem__(k, v)
  439.         
  440.  
  441.     
  442.     def __getitem__(self, key):
  443.         return dict.__getitem__(self, self.ff(key))
  444.  
  445.     
  446.     def __delitem__(self, key):
  447.         return dict.__delitem__(self, self.ff(key))
  448.  
  449.     
  450.     def __contains__(self, key):
  451.         return dict.__contains__(self, self.ff(key))
  452.  
  453.     
  454.     def __setitem__(self, key, newval):
  455.         return dict.__setitem__(self, self.ff(key), newval)
  456.  
  457.  
  458.  
  459. class LowerDict(FilterDict):
  460.     
  461.     def __init__(self, *a, **k):
  462.         
  463.         def filterfunc(x):
  464.             
  465.             try:
  466.                 x = x.lower()
  467.             except:
  468.                 pass
  469.  
  470.             return x
  471.  
  472.         FilterDict.__init__(self, filterfunc, *a, **k)
  473.  
  474.  
  475. recurse_lower = dictrecurse(LowerDict)
  476.  
  477. class LowerStorage(LowerDict, Storage):
  478.     
  479.     def __init__(self, *a, **k):
  480.         Storage.__init__(self)
  481.         LowerDict.__init__(self, *a, **k)
  482.  
  483.  
  484. recurse_lower_storage = dictrecurse(LowerStorage)
  485.  
  486. def odict_from_dictlist(seq):
  487.     od = odict()
  488.     for subdict in seq:
  489.         key = subdict.keys()[0]
  490.         od[key] = subdict[key]
  491.     
  492.     return od
  493.  
  494. if __name__ == '__main__':
  495.     import doctest
  496.     doctest.testmod(verbose = True)
  497.  
  498.